/* eslint react/no-multi-comp:0, no-console:0 */

import createDOMForm from '../src/createDOMForm'
import { DatePicker, Select } from 'ant-design-vue'
import { regionStyle, errorStyle } from './styles'
const { Option } = Select

const Email = {
  props: {
    form: Object,
  },
  render () {
    const { getFieldProps, getFieldError, isFieldValidating } = this.form
    const errors = getFieldError('email')
    return (
      <div style={regionStyle}>
        <div>email sync validate</div>
        <div>
          <input
            {...getFieldProps('email', { initialValue: '', rules: [{ type: 'email', message: <b key='err'>错误的 email 格式</b> }] })}/></div>
        <div style={errorStyle}>
          {errors}
        </div>
        <div style={errorStyle}>
          {isFieldValidating('email')
            ? 'validating'
            : null}
        </div>
      </div>
    )
  },
}

const User = {
  props: {
    form: Object,
  },
  methods: {
    userExists (rule, value, callback) {
      setTimeout(() => {
        if (value === '1') {
          callback([new Error('are you kidding?')])
        } else if (value === 'yiminghe') {
          callback([new Error('forbid yiminghe')])
        } else {
          callback()
        }
      }, 300)
    },
  },

  render () {
    const { getFieldProps, getFieldError, isFieldValidating } = this.form
    const errors = getFieldError('user')
    return (
      <div style={regionStyle}>
        <div>
          <span style={{
            color: 'red',
          }}>*</span>
          user async validate</div>
        <div>
          <input
            {...getFieldProps('user', { initialValue: '', validateFirst: true, rules: [{ required: true }, { validator: this.userExists }] })}/></div>
        <div style={errorStyle}>
          {(errors)
            ? errors.join(',')
            : null}
        </div>
        <div style={errorStyle}>
          {isFieldValidating('user')
            ? 'validating'
            : null}
        </div>
      </div>
    )
  },
}

const CustomInput = {
  props: {
    form: Object,
  },
  render () {
    const { getFieldProps, getFieldError, isFieldValidating } = this.form
    const errors = getFieldError('select')
    return (
      <div style={regionStyle}>
        <div>
          <span style={{
            color: 'red',
          }}>*</span>
          custom select sync validate</div>
        <div>
          <Select
            placeholder='please select'
            style={{
              width: '200px',
            }}
            {...getFieldProps('select', { rules: [{ required: true }] })}>
            <Option value='1'>1</Option>
            <Option value='2'>2</Option>
          </Select>
        </div>
        <div style={errorStyle}>
          {(errors)
            ? errors.join(',')
            : null}
        </div>
        <div style={errorStyle}>
          {isFieldValidating('select')
            ? 'validating'
            : null}
        </div>
      </div>
    )
  },
}

const DateInput = {
  props: {
    form: Object,
  },
  render () {
    const { getFieldProps, getFieldError } = this.form
    const errors = getFieldError('date')
    return (
      <div style={regionStyle}>
        <div>
          <span style={{
            color: 'red',
          }}>*</span>
          DateInput sync validate</div>
        <div style={{
          width: '200px',
        }}>
          <DatePicker
            placeholder='please select'
            {...getFieldProps('date', { rules: [{ required: true, type: 'object' }] })}/>
        </div>
        <div style={errorStyle}>
          {(errors)
            ? errors.join(',')
            : null}
        </div>
      </div>
    )
  },
}

function toNumber (v) {
  if (v === undefined) {
    return v
  }
  if (v === '') {
    return undefined
  }
  if (v && v.trim() === '') {
    return NaN
  }
  return Number(v)
}

const NumberInput = {
  props: {
    form: Object,
  },
  render () {
    const { getFieldProps, getFieldError } = this.form
    const errors = getFieldError('number')
    return (
      <div style={regionStyle}>
        <div>number input</div>
        <div>
          <input
            {...getFieldProps('number', { initialValue: '1', rules: [{ transform: toNumber, type: 'number' }] })}/>
        </div>
        <div style={errorStyle}>
          {(errors)
            ? errors.join(',')
            : null}
        </div>
      </div>
    )
  },
}

const Form = {
  methods: {
    onSubmit (e) {
      console.log('submit')
      e.preventDefault()
      this
        .form
        .validateFieldsAndScroll({
          scroll: {
            offsetTop: 20,
          },
        }, (error, values) => {
          if (!error) {
            console.log('ok', values)
          } else {
            console.log('error', error, values)
          }
        })
    },

    reset (e) {
      e.preventDefault()
      this
        .form
        .resetFields()
    },
  },

  render () {
    const { form } = this
    const { getFieldProps, getFieldError } = form
    return (
      <div style={{
        margin: '20px',
      }}>
        <h2>overview</h2>
        <form onSubmit={this.onSubmit}>
          <User form={form} saveRef={this.saveRef}/>

          <NumberInput form={form}/>

          <Email form={form}/>

          <CustomInput form={form}/>

          <DateInput form={form}/>

          <div style={regionStyle}>
            <div>normal required input</div>
            <div>
              <input
                {...getFieldProps('normal', { initialValue: '', rules: [{ required: true }] })}/>
            </div>
            <div style={errorStyle}>
              {(getFieldError('normal'))
                ? getFieldError('normal').join(',')
                : null}
            </div>
          </div>

          <div style={regionStyle}>
            <button onClick={this.reset}>reset</button>
            &nbsp;
            <input type='submit' value='submit'/>
          </div>
        </form>
      </div>
    )
  },
}

export default createDOMForm({
  validateMessages: {
    required (field) {
      return `${field} 必填`
    },
  },
})(Form)
